{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-10-28T07:41:11.332186Z",
     "start_time": "2025-10-28T07:41:10.987726Z"
    }
   },
   "source": [
    "from typing import TypedDict\n",
    "from langgraph.constants import END, START\n",
    "from langgraph.graph import StateGraph\n",
    "\n",
    "\n",
    "class InputState(TypedDict):\n",
    "    \"\"\"输入状态类型定义\n",
    "\n",
    "    定义了图的输入数据结构\n",
    "    \"\"\"\n",
    "    user_input: str\n",
    "\n",
    "\n",
    "class OutputState(TypedDict):\n",
    "    \"\"\"输出状态类型定义\n",
    "\n",
    "    定义了图的输出数据结构\n",
    "    \"\"\"\n",
    "    graph_output: str\n",
    "\n",
    "\n",
    "class OverallState(TypedDict):\n",
    "    \"\"\"整体状态类型定义\n",
    "\n",
    "    定义了图中节点间传递的整体状态数据结构\n",
    "    \"\"\"\n",
    "    foo: str\n",
    "    user_input: str\n",
    "    graph_output: str\n",
    "\n",
    "\n",
    "class PrivateState(TypedDict):\n",
    "    \"\"\"私有状态类型定义\n",
    "\n",
    "    定义了特定节点间使用的私有状态数据结构\n",
    "    \"\"\"\n",
    "    bar: str\n",
    "\n",
    "\n",
    "def node_1(state: InputState) -> OverallState:\n",
    "    \"\"\"处理节点1函数\n",
    "\n",
    "    接收输入状态，将用户输入与固定字符串拼接后写入整体状态\n",
    "\n",
    "    Args:\n",
    "        state: 输入状态，包含用户输入的字符串\n",
    "\n",
    "    Returns:\n",
    "        更新后的整体状态，其中foo字段为用户输入加上\">长沙市\"\n",
    "    \"\"\"\n",
    "    # Write to OverallState\n",
    "    return {\"foo\": state[\"user_input\"] + \">长沙市\"}\n",
    "\n",
    "\n",
    "def node_2(state: OverallState) -> PrivateState:\n",
    "    \"\"\"处理节点2函数\n",
    "\n",
    "    读取整体状态中的foo字段，拼接固定字符串后写入私有状态\n",
    "\n",
    "    Args:\n",
    "        state: 整体状态，包含foo字段的数据\n",
    "\n",
    "    Returns:\n",
    "        私有状态，其中bar字段为foo字段值加上\">岳麓区\"\n",
    "    \"\"\"\n",
    "    # Read from OverallState, write to PrivateState\n",
    "    return {\"bar\": state[\"foo\"] + \">岳麓区\"}\n",
    "\n",
    "\n",
    "def node_3(state: PrivateState) -> OutputState:\n",
    "    \"\"\"处理节点3函数\n",
    "\n",
    "    读取私有状态中的bar字段，拼接固定字符串后写入输出状态\n",
    "\n",
    "    Args:\n",
    "        state: 私有状态，包含bar字段的数据\n",
    "\n",
    "    Returns:\n",
    "        输出状态，其中graph_output字段为bar字段值加上\">欧富安科技园\"\n",
    "    \"\"\"\n",
    "    # Read from PrivateState, write to OutputState\n",
    "    return {\"graph_output\": state[\"bar\"] + \">欧富安科技园\"}\n",
    "\n",
    "\n",
    "# 构建状态图，指定整体状态、输入状态和输出状态类型\n",
    "builder = StateGraph(\n",
    "    OverallState,  # 整体状态类型\n",
    "    input_schema=InputState,  # 输入状态类型\n",
    "    output_schema=OutputState  # 输出状态类型\n",
    ")\n",
    "\n",
    "# 添加图节点，将函数与节点名称关联\n",
    "builder.add_node(\"node_1\", node_1)\n",
    "builder.add_node(\"node_2\", node_2)\n",
    "builder.add_node(\"node_3\", node_3)\n",
    "\n",
    "# 添加节点间的连接边，定义执行流程\n",
    "builder.add_edge(START, \"node_1\")\n",
    "builder.add_edge(\"node_1\", \"node_2\")\n",
    "builder.add_edge(\"node_2\", \"node_3\")\n",
    "builder.add_edge(\"node_3\", END)\n",
    "\n",
    "# 编译构建好的图结构，生成可执行的图对象\n",
    "graph = builder.compile()\n",
    "\n",
    "# 调用图执行，传入初始输入状态\n",
    "res = graph.invoke({\"user_input\": \"湖南省\"})\n",
    "print(res)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'graph_output': '湖南省>长沙市>岳麓区>欧富安科技园'}\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-28T07:41:25.305459Z",
     "start_time": "2025-10-28T07:41:23.697988Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from IPython.display import Image, display\n",
    "# draw_mermaid⽅法可以打印出Graph的mermaid代码。\n",
    "display(Image(graph.get_graph().draw_mermaid_png()))"
   ],
   "id": "2be0e6fa4eb66dd2",
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAGwCAIAAADOkWc9AAAQAElEQVR4nOydCXwTVeLH38wkaZve9KIHLbRQaDlaoCywQLksFFflEOQoeCGLeKHisauu/vFYUWQFBITuCiJSWEGRawURBGyRo4AI5W7pQelB6d3mnvm/yaRJWpLMJC+pQ/O++imTeW8mM7+8ee/Nu34ShmEAxlEkAIMAlg8JLB8SWD4ksHxIYPmQQJXvRp7i2un6+hqNWsloVDRoXQsiJIDRtt5DApphCIaAGwzddie3ze4n2DMRjCkC3KkPN0QzxeQOp+Fewnwn/EwS7Lb5F3GQUsJTTsn9qK4J3r2H+gIECMfqfWcO1Z3PqW2q1zI0I5GQMjkplZHwVIyOaX2hgIbyme2DNwPvk73bVvIR8DzGCAZRCNO1GSMw+r1tY7KhgPuaNr+KXj7TyQ1XRbGXqlbSGjVN0wBK2a23z+hHgoH92C3f2YP1uQerdDQIjfRMuS8oOsED3Ms0VIFfdpffuq7QauiufXzSHw2z63D75Nv4bqGimU4cHJA6uRPoWFw60Xhs721ax8z7IFb4UXbIt+aV/JAoj2kvRoGOy+FtVXnH64ZPDEtK9RESX6h8q16+PmZa58Shgk56rwMTyuy/d/ULonhjCpJv9aL8eR/EyTyB+7DubwUpY4MGpvnbjkYCPta+XjBmephbaQeZvyT2xIGqukradjQe+Ta+VxQa5ZnwJ7d4ZtswJD34v58W2o5jS77cA7VNDdopz0cAt2TAGH8PObV9ZamNOLbkO/VTde/BAcCNmbqwS3mhwkYEq/L99nM9YJiRDwcBN8bbj/T2l3z3mdUEaFW+c9m1oV3koH1JS0srLS2196j8/PwHHngAuIak1MDbt1TWQq3K11irGZTWrq8WZWVlNTU1wH4uXrwIXMaA0f46LVN8pdliqOUWl2tnm+CbdnQvl7zPwprmli1b9uzZU1RU1K1btyFDhixYsODs2bNPP/00DJ04ceLIkSOXLVsG09T27dtPnTp169at2NjYSZMmTZ06lTvD2LFjn3rqqUOHDsGj5syZs2nTJrgzJSXlpZdeysjIAM4GtilcyK6P7mnhWbQs3428JqnLmgK2bt26fv36F198cdiwYYcPH169erW3t/cTTzyxfPlyuHPnzp2RkZEwGlQQCvfmm2/CRpbCwsKPPvooPDwcHgKDpFLpjh07/vSnP0ERBw4cCCP8+OOP8PcArsHHX1JdqbYYZFm+hjsaT7mrWlLPnDmTmJjI5VaTJ08eNGhQc7OFR+PDDz9samqKiGCrTTBl7dq169ixY5x8UC9/f/9XXnkFtAt+QdLSfMvlr2WNVCoatt8B15CUlPTZZ5+9++67/fv3T01NjYqy3AYBn3GYTnNycuAzzu3hUiUH/AFAe+HlS2o0OotBluWjdTqSdJV8s2bNgk/rkSNHFi9eLJFIYGn7wgsvhISEtLoAml64cKFarX7uuedg0vP19Z07d655BJlMBtoLEjaNE4TFIMvyeXhKVQotcNHVkORkPQUFBSdPnszMzGxsbPz000/N41y+fDkvL2/NmjUwg+P2NDQ0hIaGgj+C5kaaJO2RzydQWl9jObNEB+bxCQkJcXFxsXqgLrAcaBOntrYW/jXqVaAHHgL+COrvaCSelhuvLD+hMQlytYKnscFh9u3b9+qrrx49erSuri47OxvWP2BuCPd37doV/j1w4MCFCxegrPC5hjWS+vp6WOwuXboU1m9gxdDiCaOjo6uqqmAhbswlnUvdHXVgkNRikGX5Egf7aLV0dblLEuBbb70F1Xn55Zdh9e29996DtTxYO4H7YRny4IMPrl27FhYsnTt3fv/998+fPz9mzBhYm3v22WdhpQ/Kaqz6mTN8+PDk5GRYEO/fvx+4AFWzLiHFcoec1ebSdX8vgE1Vk5910+YWI5dPNh78b8WzyyznG1aL14QUv7LCZuD2/Pq/Kr8gq1VgqwGpDwf/nlN79lBd/zGWG6zLy8tnzJhhMcjHxwcWphaD4GMLXzmAa/hSj8Ug817jNsC6kcU8gaOxTjP/n92thdrq6zi0pfLqb41Pf2S5406r1VZWVloMUiqVnp6WW/dhgeC6+keDHotBsAjy8/OzGAT3w9/bYlDWh8WwH332m9HACjxdRf9+s6BLvDz9sc7A/bh5XbVr7c1nPrFVW+J5tYB9xvm/NynrXFWJETO7M0uHTwyxHYf/zWxcRucvPygEbsb6dwq79JD3G+FnO5qgft7qck3Wx0XPLesOCOAOfP5a/siHw2Dllzem0FEGN/Ka935xK2lE4IjJHbn3o/iy4n8bymDL6P1PCsru7RkixIB1bxRIpMSEx8Ij4jpgt3nWxyV1VeoRE0P7DBM66M/uAWp7/1NWdKXZy5uK6+eTOsWRMXFi47cj9edzauur1UGdPWe8Yt8AKAeHR/6wobzkWrNGRcs8SdiX7O0r8ZCTsBxqNTySYBMsyQ79hH/ZIZGmEAkgaHY/hJIQsC+G2w/baDVqQylPSghavx+md62m5VjY8KFvuJRISPhWzkaTkrSG3ZDICK2ajUZRhE7HDZVkh5jCW6QNhxBa/QkpCQWvvKlOq2jSqRU6giKCwmXTFkQB+5sQHZSPo6Gazv2purxI0Vyv1d8MSbeSj9GPBoXtxm1HyFIUqx33zRTF6HSGIomSMjpNy9hb/YGw3VQmg0q1OidgtQDcTqgRQ7N7KAmj07IbJMnQ+j36D+xf7nciKZrWkfpvJKDWnl5UYJi077DAqHjHu3WQ5GsHxo8fn5WVFRQk0vJK7CPrYaqG73lArGD5kMDyISF2+TQaDewUB2JF1PLR+iLTdV2m6IhaPpE/uQDLh4ioL07kGR/AqQ8RLB8SWD4ksHxIiF0+XHQ4Dk59SGD5kMDyIQGrzVg+x8GpDwksHxJYPiSwfEjgFhckcOpDgqIoX1+kNaZcjdi7iurq6oCIEfejIZFota6aG+YUsHxIYPmQwPIhgeVDQuwVFyyf4+DUhwSWDwksHxJYPiSwfEhg+ZDA8iGB5UMCy4eE+OUT46yixYsX79q1i7sw+JfQQ5LkqVOngMgQ46D1BQsWdO3aldQDX3vhXyiftYXW/ljEKF9oaGhaWpr5HijfxIkTgfgQ6ZSJjIyMmJgY48fIyMhJkyYB8SFS+WAH20MPPWScEDNu3LiAADGuIC3eCTszZ87k8ruIiIgpU6YAUWJfyXtsV3VDnVqttLCsCzdfnKCINn47Rq8bblq5YZazIaitMQ43Ad0YpbS09Hr+9YiI8B7d402eOWZnMJzTdBEA0MA8qNVXtBwHgxjQ1oEHsNPWSS8f6eD0IC/BS/QLlW/Pv8tLrikkUvYGNWoLhxgu1OwGWgIMXkUtd8IA43ImhJmNEbfNTRY3208zNCx7Wcsh9kqJNke1maRuJmyr3+PuK2FrRHTbVVUoKaweEWq1LjDYY+Zrggp6QfJl77xz8UT9pPndvNxjBfsdq2/KPMCMRfwK8st3MKuq8HLTI4tigDux59+ljE436/Vo29H4i478C419hnU0YydeHpgXWVelAQqeaDzyNVUDrUaXOETU43RchFRGZu+vth2Hp8mgWaGmdaJeasN1aHV0cxPP6q088tEaANzVPprWAuP6PNbAFp9IYPmQwPJZBb7n8C5CgeWzDsP/SsEjH/sa5CZLRt4F1A5VPr14blryCoFHPndWDj55BMHz5OG8zyoMwZ98sHzWYZ3WcbXZYQiuZdAWfHkfqc8D3BOmVVusRXjkha2/f8g778+HD4wem1Jb64hpoBGapjd8uRaeZ9v2zcB+9J3ziEXHPVv01tXVvv/BmyU3ixxev46tNdM89y/enjZEfti3S6fTZa7Loih+i3GHcX7RseP7bzZ9/Z/l/8p8Z/FrhYUFsbHdp03NSB//IBeak3Nk41eZRcU3/P0DunfvufD518PCDMubr1234scDe+Ve8rFj06OiTH0DWq32i/Vrjp/Irqws79MnefLER4YMGc57GcP+PPKRabNRlk7UD6zheXj5zt6y/rFwpFJpY2PDys8+fnXRPw79dGpk6n0fL323oqIcBuWePvH2/706btxfvtn6v3f+saSiomz5yiXcUTt3bd+5a9vCF15fs+ar8PDIrzb923hCeKrt32ZNnjQ9a/Pukalj4a9y5OhB3svo0iUGcdlJ9p0NvehwwKpDo9E89uhfExP7wh9w/LgHYB5y/foVuH/9hs9TR4yZ+vAsmPR69+73zIKXjx/PvnyFtYf9bsdWKDRUx8/XDybVAf0HcadSqVT7f9wza+bjDz34sL+f//0TJo4dk24urgth+Ot9PPLpVy13pPjo1as3t+Hry1pewPQIWLe6a8b9kJ7xrM/k5ct5UN/S0pKuXU2uPvHxCdzG1auX1Gr1oJShxqDkpIEFBdfr6l0+zxdW+vieXZeVvHe/LTY2NsKk5OFhslqQy1nH2+bmJgjM5r28TAa4np5eLUexuj+/cG6bs9VU34GJEbgS+OTS4nlp48yflEpT319TcxP8G9Qp2NvbG5aPKpXSGKRQGDzOgoJZu5tFL78ZGdnF/Gyhoa63TyIAanOpE9v7JBJJz/iEvLzfjXu47di4HjCphoWFsx+nGYJgOcttREVGe3iwS/L3T07h9tTUVMOHnUu5LoUQ0FTHl/c5tb0Plp7ZOYe//XZLfUP92d9y13z+L1hE9OjeEwaNHpV29JdD8GUDbm/ZuvHixfPcIVCmxx+bD8uK8+d/g5kgLHNfee2Z5SuW8H7XlauX4FfA/7mMlduGWQQQDHx4eUtevtQHnAmsstyuqvzvtk2r1iyD1b2UgUPmPfUcFzQ7Yy58Rfts1dJ33/t7377JsFD+4J9vcY3lM6Y/GhcXn7X1yzNnTnp7+/RO7Ldo0Vu837Vi5UeXLl3gtvW1ou1wY/fOw9Ys2RyDZ4xLRaF624qix/6vB3A/Nr2X362vfMJj4Tbi4AYr6wh46+BvrDeMqhMZMCt8480XrYV+vel7WDMHqDA0jdZcqm/vF2OrC8wfMzOzrIU6QztBdd57uMEqvLNrvYPhWweBu8kdxgkVF1hzcUd3Tw72xRO5o7LDNqjywtbpEHva3LifXD9ECHeTOwrs6ECtuOg7KoGbQhKo7X0E7cbPL82IqL2vQ4LlQ4JPPgqQlJtmfjIvysODp4+Yp1YX1kUGC/DGWnfM/3QaOjyGp02bv1Ls408d31MO3IwruQ3wnSNhKE/bKr98j74VU1GkuF0s6gVBnE7uj1WDx4fwRhM6n3ft6wV+AdIuCb6+gZTWxjQt6yMyecZqWgomWmb/WjuwxSvaUhBhdWiYtRNSJKFW6IqvNFeVKWctivEP5R8cY8ds8m3LS2srNVqNTmt9qpLR6tpCkP5erQphnO1svpO7T+siWTyKgyQI2sqtWZMPvqJJZaRPAPWXx6P9w4AQxG6unZ6evnnzZmyu7SDY3hgJLB8SInd7wqkPCVHLxw4upmmXjq5FBLvFIIHlQwJbPSGBUx8SWD4ksHxI4LwPBJDSJAAAEABJREFUCZz6kMDyIYHlQwLLhwSWDwksHxJYPiSwfEjgajMSOPUhgeVDQuxuMSEh/CMl/kBELZ9Op6usrAQiBnsVIYHlQwLLhwSWDwksHxJYPiTELp9da1+0Pzj1IYHlQ0Ls8sFGFyBicOpDAsuHBJYPCSwfElg+JLB8SIhxVtHzzz+fnZ1tXL6TJEmapuHH06dPA5EhxlVaFi5cGBUVRbYA9ApGR0cD8SFG+bp37z58+HDzxwImvZEjRwLxIdI1gmbPnt2li2mtV7g9depUID5EKl9kZOTYsWO5bZjxpaSkcE7RYkO8K1TNmDGDc3eHf6dPnw5EiX0Vl4oSdU25yjAdus2sYs4X+66ZxlbngrfxbQYtc55N+z3GDZ13SHGwX89+isqQC5X1Fr+UMF+miyurWz4zNlZAsnRZFEnKfamYRC8gGKEVl9z9dWeP1mjVbOMlJ5/xAsynzBPcUsXmoS2T4lvfWquPBLc+vJm/gNk1mZ37rin2+siMcWXptl+hn2ve5jq5LcLS2mhQPpJi56F36eHzl7mCuucFyVd8Wbl3/a2k1KC+I1y7zrkYKLmsOranPK6P9+jpwbyR+eU7+3N97oE7M17vBtyJ71YW+wdJJz0Tbjsaf9GRe/BOXJJ7WLqbMeHx6Fs3+Ky1+eVTA62KHpQeCNwMLz8glRAn9/HYWvDIV1mmZtx18VJYutTfUdqOw7f8IcPWWoFbotUwGi3PveMF6JDA8lmFNdtxgsmiuy5eSguoEQtYu9RdFy+FLyEA+/M6DK1jaB3istdu7E0OSGe4Q7ureHp3WGcsuu6meZ+QW29Xq6d7DIY/4fDIR7tx3scu+c/nd8KX+pzq03ZvwS75z/fCL8Rg9g8A3VwbtmN+uTHzibmPjJ/w57nzZny5cZ1arbbrDKzJImLJyxp+iNIpi5fNWRs2Z61f8PRL3brF5edfXfP5p1qt9qm5z9pxCob/xYO/6BCnU5ZtVCrV15u/mDP7qSmT2S66/skpFy6cy845bJ98/C8dHdRc28PDY+OGbzlvUI7Q0M6Xr+QBe2A91vj047c3tjfticRcG/4qAQGGRnKNRnPiZE6P7r2APcDHjtdojOQNdiDnE5u5NnyQb94snjPnKbuOonVAp0U01wYO1vvEY6696esvvtn29SdL18T3sC/1CcFV9T4xmGtD3T/451uncn+FGYXRHdmee0BuMnBiodv+5tofL1185szJz1d/FRPjSCe1EH9OAU0GTqr3tbO59p69O349/suSf650TDsW3rTH/9ZBGhpunEK7mWsrlcp161YMHTJCq9NyttqOmGvrGB2qRyVwZpNBu5lrF5cUNjY1Hjy0H/5vvv+HvdnOXUQbm2tb5ev3C7r1lac/aiuTxY311mGrHchFhzgbrNrBXBs2VhEMWsUFFh3iTH3tYa5NAgaxsR7Q4m0udbW5Nrx3VH9ewp3zPgHwN5e6bWO9E17a3LrkBcAJ5tpum/oIdoAUYpMBoc9A3RLYyYPc18EA0l0fXpIiKAqtn5dNffdmTxs6NGwy0KENziXYSTYAYw08RAgJHvnYAZZua67tSUo8eFaN5skaQ6JlsPIo7lXMXAXsaQsKQ5MP4uUtOb67CrgZlcVqWHQMGM3TG8UvX9qs8MKL9cDNOLS1rHuyL280QRNSFQ26De8WRffwTr4v1D+oI2eFOiU4e7T6yum61InBiUOdJB/kdrH2hw2ljU1aRgdo2uYhjM2RCSihzjqKbQixcABbS5MQMk+q75/9B08QNAvS7mVwdGqga/kyS7PJ9Zd3VwRgaRvo8w7ziqn5Ry7m5ClTMjMzg4OD+Sajt72Su09uusK75/3roXSAsmMiPovdI6woGWhPv1eVqkEul8hkQJyIfVoMtjdGAsuHBJYPCSyf42C3GCSwfEhg+ZDA8iGh0WiwfI6DUx8SWD4ksHxIYI9KJHDqQwLLhwR+eJHAqQ8JLB8SWD4kcN6HBE59SGD5kIDahYWFAREj9tRXUVEBRAz2KkICy4eEqOWDtRbsUek4OPUhgeVDAsuHBDbXRgKnPiSwfEhg+ZDA8iGB5UMCy4cElg8JLB8S2FzbEebNm3fq1CnOF1rvMklwG2fPngUiQ4wGswsWLIiMjOSctSmK4jawP69QBgwYkJycbP5YwDffpKQkID5Eam88Z86ciAjTCl9wOyMjA4gPkcrXq1evoUOHcgmQpunExMSEhAQgPkRtrs25u4eGhs6aNQuIEvHKFxsbCxMgTHrx8fH9+/cHokRoxaXhNtixrqipXse6l9GtzLVbz+Zu2Tb9yxAtoebbrTGdoU0c2x+FTSS3FMfSPlhDIingIZcMTO2UPJZ/Jj4QWG1WK5ivPy6IiJWPmBwUGCrj2n8pYJhWThqWtm8loXEnN6WbcGgb2PlR4B7zazYH3pGikfn9aNXxH6t8AqnuA+R8wghIfbeLmW9X38h4Ixa4E1s/Lozr5z1mOo/BO3/et+eL4piefsDNGD0p4urpBt5o/PIpmnVDH+T3iO9ghMXLCAqcPcyzgA2PfOXFagIwlFhXYnApBEXUVqCZaxM00PEZTHdUtEpaqeTpJhX7ZHyRg+VDAstnFViFpvjkwfJZRe+UxRMHy4cE/6rhGBsIWfrVTWFI/lWDceqzCqzz0qjm2gw2nLAFv82d+xpOCACXvFYhYN7Hl/nhvM8qjICWbL4Gqz/owUX3JlepVF9uzHzyqenp9w+bO2/GusyVSqXSvlMw7Kr/tqN02Id3xcqPfsk+dP+ESb1798vNPb71v1/BvvZnFrwEnErHlK+q6vYP+3a9/to7nKl36ogxjY0NJ07m2C8fYt5nP2LwJg8ODvn5YK75HkoikUnta/XV9+mhuUM7UHKIxJvcCOwL++67rUeO/PToo/OAPRAMf87Pb+3ugIbi8SZ/8eW/jrlv0NrMFc89+8qI4aOBs+FPfYxDpa9IvMnhL/SvZWsnpD/02aql27ZvBnYhIOkIsblzBDF4k0M4O/f+ySkhIWH/+WI1zAHsWhwB2VzbebSnNzkseXOOHblv7AR4Zm5PbLfuMBU3NTXa5f5J8D2d7ffW0Z7e5LCMXr5iCfxhhg8fxe0puHEdmCVqQcBqM8PTy9iubx3t5k2ekNAHFk2r1nwC48Mv2rd/95atX8ISifslnEi7VpvbzZscJuf3Fn+yavUnHy55G2a4vj6+6ekPLZj/InA22JvcKpvey+/WVz7hsXAbcXCDlXWcYjArTtrBm9zCCMC7EJL6ROpNnpW121oozOyAM0D152WAeJvqnaURCvxdRbivwwb81u4YG/C/87othAB7U1xxsQp8YWNQ+zrww2sTPMYFCfzwIoHlQ4Kv5KUYghLvtEGXQskI3lWjeeTrHOxBumvpQTKEdyCiubYXkHiQp/c7PljiHkXdCDRaeugEZHPt5BFB+edqgZuxd31JWAx/y76g+bz555oPZFWkpAX3HPTHv6W7msoi9c/flEX39Bo3J5Q3stDp0Md21+T9WquFtXCGuXu4PkEyDN06jyTu6qUnWvo9GcJsz90RCDOv5zYfTX/Z6yYMAylM0cy/Au6gDWvA6AMZU2T9ywBJMrT+mkmKnYMAoSi4De+EiYj1emi+rUZm0yXbtQxOyWV1VUXz3bPc4FW2PQ+hH1tt7m6tF7TV2Af2tri7YkBL17D+NIzhDADs+G7H+PHpcrkXaFGFPYD9Ou5o9h+C5sbAMtwpGLZ7jGDj0IA7MzDpBiMTDHsA3CQZriMNFo76QcwUSXr7y+IFzII23ZMIVxEyJy0t7ZtvvgkMFGS03v6IvdoscssObG+MBJYPCbHLp9PpsHwOArWjYG1CxGB/XiSwVxESWD4ksHxIYJs7JHDqQwLLhwSWDwksHxK46EACpz4ksHxIYPmQELt8OO9zHJz6kMDyIYHlQ4IkyZCQECBixJ76qqqqgIjBXkVIYPmQwPIhgeVDAsuHBJYPCSwfElg+JLB8SGD5kMDyIYHlQwLLhwSWDwksHxJYPiTEOC1m/vz5BQUFQD+2uba21svLi6ZpjUaTm5sLRIYYpzrPmDEDJrqampr6+nrYXq9SqaB24eGCJpm1M2KUb/To0fHx8eaPBdzu0UOMi+CJdKL9E088ERQUZPwIO4xmzpwJxIdI5RsyZEhiYqLRXDsuLm7QoEFAfIh3mQdjAgwMDJw2bRoQJeKVLykpKTk5GZYhMTExo0aNAqLECRWX4rzm04draiu1Kr0hJs0AWssQxmndJEFzs7pN07wNK4sZJpYbbbi5aIR+DjX3szJwH7uTMExON/xlGC4mZwV0lysJYZxPzcZrPfmakXmQEinpFySN7+/bLxXVdxhJvh2rysqKmmkdQ0kpmVzq6e0hk0sYgl3t2HALTMtUbdLwmXMWZ4BBB/1/wBS7ZcU7xvCHAGZyA4NaZpIbdt49679lkzAdS1EEvFSdmlE1qdQKrVbNVsiDOntMeDLSL9DB1VYclG/X2rKSa81SKRUY5R8Sd696R9dXKm7fqFE2qgNDpLNejwb244h8n7+aT1BEzMBIL58OsobT9eOlqkb1fTM790zxsetA++SrLldnLS0OivQLTwgCHYuGSmXR7+XJqQHDJ9pxa3bIV3dbu2lJUe/RXQlRT7FFIu9g4dAHggeM4vdi4BAqX3WZbsvSwt5pXUFH59LhooQU31HTBA2ME1rv2/LJjS59+FfV6QAkjIrJ+7XudpFGSGRB8m1YXOTp6+EXbsf6MPc0obGdtq0qFhKTX768Yw1NdZq4wRHAbQiJ84cNZTvW3OKNyS9fzp7b/mH2FecdgC59wm7lN/NG45Hv5lWVWkl36SfSAcaNTTWv/GPwb+d/As7GO9iDpMh9X1XajsZT783ZdVvm2UHqxvbiG+RdcqnJdhye1FdVpvQN8QZuSURikFLfCGIDnpQFG0vCuncCrqG+4c7uH5YXlvyuVit79hhy38gnQ0Ni4P6yivxlq2a9MH/9oaMbL1w64u8Xmtw37f60Z7klcc7+/uO+g+sUivrEXiNGDssALoOUECRJnD5YO3CsVesPW6nvyskG2C5EuubZhb1oa9c/k1945uEH/7bouSwf704rM5+sunMTBkkodh7btp0f9u83fsk72bOmLj6Ss/lcHpvBlVVcz9r+dkr/+//24rcpyX/ZuXcZcCXw1b7kqq0CxJZ8FaVqknKwJYeXG8W/VVYVzpy6uFf8UD/foAfTX/CWB/zy61ZjhKTeY5L6jJVIpHHdBgQFRt4svQx3HjvxbYB/57RRc+Vyv+6xAwenTAKuRCqTqBW2vMZsJS21UgtIVzVHFxadoyhpj1iD+xpM5lCmgsKzxghREQnGbU9PX4WStQusqi7pHGbyYuwSmQhcC6NS2uqntyUfBfSLXLoGhbJRp9PAaof5Th9v0yqRMNu4+6jm5vrgIJNdoExmj22d/ZAEIZXZev5sySfvJHXdCARfnyB4809mtMq8SL7EDp9ZjcbkxahS8VQsEO5iwdEAAAM+SURBVNExjERiq33JlnzR8d65B6qBa4gMj1erFQEBYcGdorg9d6pLzVOfRQIDwi9e/gV2XXJCX7ySDVwJo2UCQ20ZC9r6tcO7sQm3qVoFXECPuEG9egzd9v0HNbXljU21OSe2r1j7+Mkzu20fldT7Pvim8f3eZaznb8HpYye2A1ei1eji+tt6YeWplXh6U3eK6rw7uaSp6snZ//r11Hdff/NWUcn5kOCYAUnpI4ZOt31Izx6DHxj//K8nv3v17SGwCM6Ytnj1f+a7yFWkrqwZZr9dE2xlrzzNpQc2V17/vSlhlCPdKPc614/f8vBg5rxh6955suq0jFBGRysaed5dOiSqJvXg8TxvXPyvFJ06e9w8V9ZjWJTFUJiLv/1hmsUg2JMKa3YWbR47h8Q+91eh/uJC+GLTyzeKz1kM0mhUUqmF7F8m9Xz7tb3ACiXnq2CVJX4gT0udoL6O1YvyY1MivQIsrwlSXWO5WVGpbPT0tPz1JCkJ8HdmflpfX6XVqS0GNTXXe8st9kQTnQKtjhm8eLBwwqPh3frxNLALku/w9tuXTjXATgDgHuQfL5P7gJmvRvHGFPRONmpqiK+/NP84f+N1B6Dsaq1GrRaiHRDe0zb7jS60Vnstp4MrWH6tvrqk5ukPYwXGt2+UwZZPbjY3grjBYhxmjE5p3p268oZnPokTfojdY1y+er+4oZbtePP0kYEOxLXsmzqt7umPhKY7DkeGCB3aVpV3rNbTWxqTEinzuOeNtApyK5prFRFd5VOet/upcnx8X9ZHxdWVsGZH+XSSh3QL8PS7p3qUdKAiv6ausgm2aXr7Sh76a0RQhCNLtaGOLt37RXlpvkKjphmagZ0DsHeAdb2xck7OYkg/sNE0ClI/UrR1fNPgR9NIR85dx3Se1i5HhNGkp83DYL6HAZSE0GnY0ZrwaiVSKjjSI21mmH+I40OenDarKP9c882riuZGjUpJm8yMWg/8hNrSDOc1pHcNolsbCRmviRtDqh+Qym2ww1X1Q3ENo3pbxowSFMPo9O81BDANaTVzbzKcUH8GeJiXt8RDToZFefYZ5hzLL7F7FYkcN+0CdxZYPiSwfEhg+ZDA8iGB5UPi/wEAAP//z1Z7UwAAAAZJREFUAwAOgEQYMPEVigAAAABJRU5ErkJggg==",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 2
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
